package cn.fengkuok.core.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * 日時データ({@link java.util.Date}型)用のユーティリティクラスです。
 * <p>
 * 年月日のみのデータ(日付データ)を扱う際は{@link OperationDate}クラスを使用してください。
 * 
 * @see OperationDate
 * @version $Revision: 1.1 $ $Date: 2010/04/08 04:13:11 $
 * @author $Author: GuoFeng $
 */
public class DateUtils {
	/** 日付フォーマット ： YYYYMMDDHHMISSSSS */
	public static final String DATE_FMT_YYYYMMDDHHMMSSSSS_WITHOUT_SEP = "yyyyMMddHHmmssSSS";
	/** 日付フォーマット ： YYYYMMDDHHMISS */
	public static final String DATE_FMT_YYYYMMDDHHMISS_WITHOUT_SEP = "yyyyMMddHHmmss";

	/** 日付フォーマット ： YYYYMMDDHHMISS */
	public static final String DATE_FMT_YYYYMMDDHHMISS = "yyyy/MM/dd HH:mm:ss";

	/** 日付フォーマット ： YYYYMMDD */
	public static final String DATE_FMT_YYYYMMDD = "yyyyMMdd";

	/** 日付フォーマット ： YYMMDD */
	public static final String DATE_FMT_YYMMDD = "yyMMdd";

	/** 日付フォーマット ： MMDD */
	public static final String DATE_FMT_MMDD = "MMdd";

	/** 日付フォーマット ： YY */
	public static final String DATE_FMT_YY = "yy";

	/** 日付フォーマット ： MM */
	public static final String DATE_FMT_MM = "MM";

	/** 日付フォーマット ： DD */
	public static final String DATE_FMT_DD = "dd";

	/** 日付フォーマット ： YY/MM/DD */
	public static final String DATE_FMT_YYMMDD_WITH_SLASH = "yy/MM/dd";

	/** 日付フォーマット ： MM/DD */
	public static final String DATE_FMT_MMDD_WITH_SLASH = "MM/dd";

	/** 日付フォーマット ： YYYY/MM/DD */
	public static final String DATE_FMT_YYYYMMDD_WITH_SLASH = "yyyy/MM/dd";

	/** GMTをあらわすTimeZoneオブジェクト */
	public static final TimeZone GMT = TimeZone.getTimeZone("GMT");

	/**
	 * プライベートなコンストラクタ。
	 */
	private DateUtils() {
	}

	/**
	 * 指定されたjava.util.Date値を、指定された書式パターンでフォーマットして返します。
	 * <p>
	 * 使用可能な書式パターンは{@link SimpleDateFormat}クラスの定義にもとづきます。
	 * <p>
	 * Date値が<code>null</code>の場合は空文字列を返します。
	 * 
	 * @param date
	 *            日時値。
	 * @param pattern
	 *            書式パターン。
	 * @return 変換後の文字列。
	 * @throws NullPointerException
	 *             書式パターンがnullの場合。
	 * @throws IllegalArgumentException
	 *             書式パターンがSimpleDateFormatクラスで解釈できない場合。
	 * @see SimpleDateFormat
	 * 
	 */
	public static String convertDateToString(Date date, String pattern) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/**
	 * 指定されたjava.util.Date値を、指定された書式パターンとタイムゾーンでフォーマットして返します。
	 * <p>
	 * 使用可能な書式パターンは{@link SimpleDateFormat}クラスの定義にもとづきます。
	 * <p>
	 * Date値が<code>null</code>の場合は空文字列を返します。
	 * 
	 * @param date
	 *            日時値。
	 * @param pattern
	 *            書式パターン。
	 * @param timeZone
	 *            タイムゾーン。
	 * @return 変換後の文字列。
	 * @throws NullPointerException
	 *             書式パターンがnullの場合。
	 * @throws IllegalArgumentException
	 *             書式パターンがSimpleDateFormatクラスで解釈できない場合。
	 * @see SimpleDateFormat
	 * 
	 */
	public static String convertDateToString(Date date, String pattern,
			TimeZone timeZone) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		sdf.setTimeZone(timeZone);
		return sdf.format(date);
	}

	/**
	 * 将当前日期转换为指定格式的字符串
	 * 
	 * @return 变换格式后的字符串
	 */
	public static String convertNowToString() {
		return convertDateToString(new Date(), DATE_FMT_YYYYMMDDHHMISS);
	}

	/**
	 * 将日期转换为指定格式的字符串
	 * 
	 * @param date
	 *            指定日期
	 * @return 变换格式后的字符串
	 */
	public static String convertToCommonFormat(Date date) {
		return convertDateToString(date, DATE_FMT_YYYYMMDDHHMISS);
	}

	/**
	 * 对给定日期进行天数增减
	 * 
	 * @param date
	 *            指定日期
	 * @param days
	 *            增加天数,可以为负
	 * @return 变换后日期
	 */
	public static Date plusDays(Date date, int days) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, days);
		return calendar.getTime();
	}
	
	/**
	 * 将指定格式的字符串转化成Date
	 * @param date 指定格式的字符串
	 * @param pattern 指定格式
	 * @return 变换后的日期
	 */
	public static Date convertStringToDate(String date,String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		//sdf.setTimeZone(GMT);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
}
